<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>More like this query | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'query-dsl-mlt-query.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/query-dsl-mlt-query.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/query-dsl-mlt-query.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/query-dsl-mlt-query.html" rel="nofollow" target="_blank">../en/query-dsl-mlt-query.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="query-dsl.html">查询领域特定语言(Query DSL)</a></span>
»
<span class="breadcrumb-link"><a href="specialized-queries.html">专业的查询</a></span>
»
<span class="breadcrumb-node">more_like_this 查询</span>
</div>
<div class="navheader">
<span class="prev">
<a href="query-dsl-distance-feature-query.html">« distance_feature 查询</a>
</span>
<span class="next">
<a href="query-dsl-percolate-query.html">percolate 查询 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="query-dsl-mlt-query"></a>more_like_this 查询
</h2>
</div></div></div>

<p>
more_like_this 查询（以下简称 MLT）查找与给定文档集“相似(like)”的文档。

为此，MLT 选择这些输入文档的一组代表性词项，使用这些词项形成查询，执行查询并返回结果。

用户控制输入文档、如何选择词项以及如何形成查询。
</p>
<p>
一个最简单的用例是请求与提供的文本相似的文档。

在这里，我们要求所有电影的“title”和“description”字段中有类似“Once upon a time”的文本，将所选词项的数量限制为12个。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
    "query": {
        "more_like_this" : {
            "fields" : ["title", "description"],
            "like" : "Once upon a time",
            "min_term_freq" : 1,
            "max_query_terms" : 12
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/234.console"></div>
<p>
一个更复杂的用例是将文本与索引中已经存在的文档混合。

在这种情况下，指定文档的语法类似于<a class="xref" href="docs-multi-get.html" title="Multi get (mget) API" rel="nofollow">Multi GET API</a>中使用的语法。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
    "query": {
        "more_like_this" : {
            "fields" : ["title", "description"],
            "like" : [
            {
                "_index" : "imdb",
                "_id" : "1"
            },
            {
                "_index" : "imdb",
                "_id" : "2"
            },
            "and potentially some more text here as well"
            ],
            "min_term_freq" : 1,
            "max_query_terms" : 12
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/235.console"></div>
<p>
最后，用户可以混合一些文本、一组选定的文档，但也可以提供不一定出现在索引中的文档。

为了提供索引中没有的文档，语法类似于 <a class="xref" href="docs-termvectors.html#docs-termvectors-artificial-doc" title="Artificial documents" rel="nofollow">人工文档</a>。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
    "query": {
        "more_like_this" : {
            "fields" : ["name.first", "name.last"],
            "like" : [
            {
                "_index" : "marvel",
                "doc" : {
                    "name": {
                        "first": "Ben",
                        "last": "Grimm"
                    },
                    "_doc": "You got no idea what I'd... what I'd give to be invisible."
                  }
            },
            {
                "_index" : "marvel",
                "_id" : "2"
            }
            ],
            "min_term_freq" : 1,
            "max_query_terms" : 12
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/236.console"></div>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_how_it_works"></a>它是如何工作的?
</h3>
</div></div></div>
<p>
假设我们想要找到所有与给定的输入文档相似的文档。

显然，输入文档本身应该是该类型查询的最佳匹配。

根据 <a href="https://lucene.apache.org/core/4_9_0/core/org/apache/lucene/search/similarities/TFIDFSimilarity.html" class="ulink" target="_top">Lucene 评分公式</a>，主要原因是 tf-idf(词频-逆向文档频率) 最高的词项。

因此，输入文档中具有最高 tf-idf 的词项是该文档的很好的代表，并且可以在析取<span class="remark">(disjunctive)</span>查询(or或<code class="literal">OR</code>)中用来检索相似的文档。

MLT查询简单地从输入文档中提取文本，分析它，通常对字段使用相同的分析器，然后选择具有最高 tf-idf 的前 K 个词项来形成这些词项的析取<span class="remark">(disjunctive)</span>查询。
</p>
<div class="important admon">
<div class="icon"></div>
<div class="admon_content">
<p>
要执行 MLT 的字段必须进行索引，并且必须是 <code class="literal">text</code> 或 <code class="literal">keyword</code> 类型。

此外，对文档使用 <code class="literal">like</code> 时，必须启用 <code class="literal">_source</code>，或者字段必须是<code class="literal">stored</code> 或 存储(store) <code class="literal">term_vector</code><span class="remark">(词项向量)</span>。

为了加速分析，在索引时存储词项 向量(vector) 会有所帮助。
</p>
</div>
</div>
<p>
例如，如果我们希望对“title”和“tags.raw”字段执行 MLT，我们可以在索引时显式存储它们的 <code class="literal">term_vector</code>。

我们仍然可以在“description”和“tags”字段上执行 MLT，因为 <code class="literal">_source</code> 在默认情况下是启用的，但是这些字段的分析速度不会加快。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT /imdb
{
    "mappings": {
        "properties": {
            "title": {
                "type": "text",
                "term_vector": "yes"
            },
            "description": {
                "type": "text"
            },
            "tags": {
                "type": "text",
                "fields" : {
                    "raw": {
                        "type" : "text",
                        "analyzer": "keyword",
                        "term_vector" : "yes"
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/237.console"></div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_parameters_2"></a>参数
</h3>
</div></div></div>
<p>
唯一需要的参数是 <code class="literal">like</code>，所有其他参数都有合理的默认值。

有三种类型的参数：一种用于指定文档输入，另一种用于词项选择 以及 查询的形成。
</p>
<h4>
<a id="_document_input_parameters"></a>文档输入参数
</h4>
<div class="informaltable">
<table border="0" cellpadding="4px">
<colgroup>
<col>
<col>
</colgroup>
<tbody valign="top">
<tr>
<td valign="top">
<p>
<code class="literal">like</code>
</p>
</td>
<td valign="top">
<p>
MLT查询唯一<span class="strong strong"><strong>需要的</strong></span>参数是 <code class="literal">like</code>，它遵循一个通用的语法，用户可以指定自由格式的文本和/或一个或多个文档(参见上面的例子)。

指定文档的语法与 <a class="xref" href="docs-multi-get.html" title="Multi get (mget) API">Multi GET API</a> 使用的语法类似。

指定文档时，除非在每个文档请求中被覆盖，否则将从 <code class="literal">fields</code> 中提取文本。

文本被字段指定的分析器分析，但是这个分析器也可以被覆盖（重新指定）。

覆盖字段的分析器的语法与 <a class="xref" href="docs-termvectors.html#docs-termvectors-per-field-analyzer" title="Per-field analyzer">Term Vectors API</a> 中的 <code class="literal">per_field_analyzer</code> 参数的语法相似。

此外，为了提供不一定出现在索引中的文档，也支持<a class="xref" href="docs-termvectors.html#docs-termvectors-artificial-doc" title="Artificial documents">人工文档(artificial documents)</a>。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">unlike</code>
</p>
</td>
<td valign="top">
<p>
 <code class="literal">unlike</code> 参数与 <code class="literal">like</code> 一起使用，以便不选择在一组选定的文档中找到的词项。

换句话说，我们可以要求 <code class="literal">like: "Apple"</code> 这样的文档，但<code class="literal">unlike: "cake crumble tree"</code> 。<span class="remark">(译者注: 像Apple, 但是不像 cake crumble tree)</span>

语法和 <code class="literal">like</code> 一样。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">fields</code>
</p>
</td>
<td valign="top">
<p>
要从中提取和分析文本的字段列表。
</p>
</td>
</tr>
</tbody>
</table>
</div>
<h4>
<a id="mlt-query-term-selection"></a>词项选择(term selection)参数
</h4>
<div class="informaltable">
<table border="0" cellpadding="4px">
<colgroup>
<col>
<col>
</colgroup>
<tbody valign="top">
<tr>
<td valign="top">
<p>
<code class="literal">max_query_terms</code>
</p>
</td>
<td valign="top">
<p>
将被选择的查询词项的最大数量。

增加该值可以以查询执行速度为代价而获得更高的准确性。

默认为 <code class="literal">25</code>。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">min_term_freq</code>
</p>
</td>
<td valign="top">
<p>
最小词项频率，低于该频率的词项将从输入文档中忽略。默认为 <code class="literal">2</code>。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">min_doc_freq</code>
</p>
</td>
<td valign="top">
<p>
最小文档频率，低于该频率的词项将从输入文档中忽略。默认为 <code class="literal">5</code>。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">max_doc_freq</code>
</p>
</td>
<td valign="top">
<p>
最大文档频率，高于该频率的词项将从输入文档中忽略。

这对于忽略高频词(如停止词)很有用。

默认为无限制(<code class="literal">Integer.MAX_VALUE</code>，其值为 <code class="literal">2^31-1</code> 或者 2147483647)。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">min_word_length</code>
</p>
</td>
<td valign="top">
<p>
最小单词长度，小于该长度的单词将被忽略。

旧名称 <code class="literal">min_word_len</code> 已废弃。

默认为 <code class="literal">0</code>.
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">max_word_length</code>
</p>
</td>
<td valign="top">
<p>
最大单词长度，大于该长度的单词将被忽略。

旧名称 <code class="literal">max_word_len</code> 已废弃。

默认为无限制 (<code class="literal">0</code>)。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">stop_words</code>
</p>
</td>
<td valign="top">
<p>
停止词数组。

这个集合中的任何单词都被认为是“不感兴趣的”并被忽略。

如果分析器允许停止词，你可能想要告诉 MLT 显式地忽略它们，因为为了文档相似性的目的，假设“停止词从不有趣”似乎是合理的。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">analyzer</code>
</p>
</td>
<td valign="top">
<p>
用于分析自由格式文本的分析器。

默认为与 <code class="literal">fields</code> 中的第一个字段相关联的分析器。
</p>
</td>
</tr>
</tbody>
</table>
</div>
<h4>
<a id="_query_formation_parameters"></a>查询形成(query formation)参数
</h4>
<div class="informaltable">
<table border="0" cellpadding="4px">
<colgroup>
<col>
<col>
</colgroup>
<tbody valign="top">
<tr>
<td valign="top">
<p>
<code class="literal">minimum_should_match</code>
</p>
</td>
<td valign="top">
<p>
形成析取查询后，该参数控制必须匹配的词项的数量。

语法与 <a class="xref" href="query-dsl-minimum-should-match.html" title="minimum_should_match parameter" rel="nofollow">minimum should match</a> 相同。

(默认为 <code class="literal">"30%"</code>)。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">fail_on_unsupported_field</code>
</p>
</td>
<td valign="top">
<p>
控制如果任何指定字段不属于支持的类型(<code class="literal">text</code> 或 <code class="literal">keyword</code>)，查询是否应该失败(抛出异常)。

将此项设置为 <code class="literal">false</code> 以忽略该字段并继续处理。
默认为 <code class="literal">true</code>。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">boost_terms</code>
</p>
</td>
<td valign="top">
<p>
所形成的查询中的每一项都可以被它们的 tf-idf 分数进一步增强。

这将设置使用此功能时要使用的 boost(增强) 因子。

默认为停用 (<code class="literal">0</code>)。

任何一个正数的值都将激活具有给定增强因子的词项增强。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">include</code>
</p>
</td>
<td valign="top">
<p>
指定输入文档是否也应包含在返回的搜索结果中。默认为 <code class="literal">false</code>。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">boost</code>
</p>
</td>
<td valign="top">
<p>
设置整个查询的增强(boost)值。默认为 <code class="literal">1.0</code>。
</p>
</td>
</tr>
</tbody>
</table>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_alternative"></a>可替代的(Alternative)
</h3>
</div></div></div>
<p>
为了更好地控制相似文档查询的构造，值得考虑编写定制的客户端代码，将示例文档中的选定的词项组合成具有所需设置的 bool 查询。

在 <code class="literal">more_like_this</code> 中从一段文本中选择“感兴趣的”单词的逻辑也可以通过 <a class="xref" href="docs-termvectors.html" title="Term vectors API">TermVectors API</a>访问。

例如，使用 TermVectors API，可以向用户提供在文档文本中找到的主题关键词的选择，允许他们选择感兴趣的单词进行深入研究，而不是使用 <code class="literal">more_like_this</code>使用的更“黑盒(black-box)”的匹配方法。
</p>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="query-dsl-distance-feature-query.html">« distance_feature 查询</a>
</span>
<span class="next">
<a href="query-dsl-percolate-query.html">percolate 查询 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>